home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d883.lha / BBBBS / BBBBS59.lha / rexx / bbsQUICKIN.rexx < prev    next >
OS/2 REXX Batch file  |  1993-06-11  |  23KB  |  935 lines

  1. /* $VER: bbsQUICKIN.rexx 5.9 © 1993 Richard Lee Stockton (11.6.93) 
  2.    - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  3.  
  4.    Processes archive "QUICKIN.lha" in user's emailfiles.
  5.    Should be made by bbsQUICK.rexx, the offline reader.
  6.    Handles incoming mail, messages, downloads, and uploads.
  7.    Also handles some sysop and super-sysop offline functions.
  8. */
  9.  
  10. CR='0D'x
  11. LF='0A'x
  12. SIGNAL ON ERROR
  13. SIGNAL ON SYNTAX
  14. SIGNAL ON FAILURE
  15.  
  16. ARG name level sysoplevel accessflag .
  17.  
  18. fromcli=0
  19. IF name='' THEN
  20.   DO
  21.     figarg='s:CONFIG.BBS'
  22.     IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  23.     x=OPEN(f,figarg,'R')
  24.     IF x=0 THEN
  25.       DO
  26.         SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  27.         CALL GETOUT(20)
  28.       END
  29.     lynes.=''
  30.     DO i=1 TO 8
  31.       lynes.i=READLN(f)
  32.     END
  33.     CALL CLOSE(f)
  34.     compos=POS('/*',lynes.1)
  35.     IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  36.     bbsname=STRIP(lynes.1)
  37.     sysop=WORD(lynes.2,1)
  38.     sysoplevel=WORD(lynes.5,1)
  39.     bbspath=WORD(lynes.6,1)
  40.     IF RIGHT(bbspath,1)~=':' & RIGHT(bbspath,1)~='/' THEN bbspath=bbspath'/'
  41.     msgpath=WORD(lynes.7,1)
  42.     IF RIGHT(msgpath,1)~=':' & RIGHT(msgpath,1)~='/' THEN msgpath=msgpath'/'
  43.     libpath=WORD(lynes.8,1)
  44.     IF RIGHT(libpath,1)~=':' & RIGHT(libpath,1)~='/' THEN libpath=libpath'/'
  45.     name=sysop
  46.     IF ~EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  47.       DO
  48.         SAY bbspath'EmailFiles/'name'/QUICKIN.lha does not exist!'
  49.         CALL GETOUT(21)
  50.       END
  51.     level=99
  52.     sysoplevel=99
  53.     accessflag=0
  54.     fromcli=1
  55.   END
  56. ELSE
  57.   DO
  58.     bbspath=GETCLIP('BBS_path')
  59.     msgpath=GETCLIP('BBS_msgpath')
  60.     libpath=GETCLIP('BBS_libpath')
  61.   END
  62.  
  63. /* Wait 5 mins for QUICKOUT process (started by this user) to finish */
  64.  
  65. DO i=1 TO 100 WHILE GETCLIP('BBS_'name)='QUICK'
  66.   CALL DELAY(150)
  67. END
  68.  
  69. /* Only one QUICKIN process at a time per user */
  70.  
  71. IF GETCLIP('BBS_'name)='QUICKIN' THEN EXIT
  72. CALL PRAGMA('P',-1)
  73.  
  74. CALL TIME('R')
  75. CALL SETCLIP('BBS_'name,'QUICKIN')
  76.  
  77. arcfile=bbspath'Emailfiles/'name'/QUICKIN.lha'
  78. savefiles=0
  79. upfiles=-1
  80. upbytes=0
  81. upmail=0
  82. upmsg=''
  83.  
  84. lastm=get_last(bbspath'Numbers/LastMail')
  85. CALL CLOSE(STDOUT)
  86. CALL OPEN(STDOUT,bbspath'Email/'name'/BBBBS.'lastm,'W')
  87. SAY ' Mail: 'lastm
  88. SAY ' From: BBBBS'
  89. SAY '   To: 'name
  90. SAY ' Subj: QUICKIN Report'
  91. SAY ' Date: 'DATE('W') DATE() TIME('C')
  92. SAY LEFT('=',75,'=')
  93. SAY 'Here is the log of your QUICKIN file processing.'
  94. SAY STRIP(SUBSTR(SOURCELINE(1),3))
  95. SAY
  96.  
  97. ADDRESS COMMAND 'lha -q t' arcfile
  98. IF RC>0 THEN
  99.   DO
  100.     SAY 'QUICKIN archive is corrupt!  Aborting...'
  101.     SIGNAL DONE
  102.   END
  103.  
  104. CALL MAKEDIR('RAM:QUICK')
  105. CALL PRAGMA('D','RAM:QUICK')
  106. ADDRESS COMMAND 'CD RAM:QUICK' LF 'lha -mN x' arcfile
  107. SAY
  108.  
  109. CALL do_file_requests()
  110.  
  111. CALL do_file_deletes()
  112.  
  113. DO i=.001 TO .999 BY .001
  114.   hdr=RIGHT(i,3)'.HDR'
  115.   IF ~EXISTS(hdr) THEN ITERATE i
  116.   txt=RIGHT(i,3)'.TXT'
  117.   x=OPEN(f,hdr,'R')
  118.   IF x=0 THEN
  119.     DO
  120.       SAY hdr 'failed to open for reading.'
  121.       ITERATE i
  122.     END
  123.   hdr.=''
  124.   DO j=1 TO 6
  125.     hdr.j=READLN(f)
  126.   END
  127.   CALL CLOSE(f)
  128.   IF LEFT(hdr.1,6)='File: ' THEN CALL do_file()
  129.   ELSE IF LEFT(hdr.1,6)='  Msg:' THEN CALL do_msg()
  130.   ELSE IF LEFT(hdr.1,6)=' Mail:' THEN CALL do_mail()
  131.   ELSE
  132.     DO
  133.       SAY
  134.       SAY hdr 'is an unknown header type!'
  135.       DO j=1 TO 6
  136.         SAY hdr.j
  137.         SAY
  138.       END
  139.       ITERATE i
  140.     END
  141.   IF WORDS(SHOWDIR('RAM:QUICK','F'))=0 THEN LEAVE i
  142. END
  143.  
  144. IF savefiles=1 THEN
  145.   DO
  146.     x=OPEN(f,bbspath'Lists/Files','W')
  147.     IF x=0 THEN SAY bbspath'Lists/Files failed to open for writing!'
  148.     ELSE
  149.       DO
  150.         DO i=1 TO f.0
  151.           IF f.i~='' THEN CALL WRITELN(f,i f.i)
  152.         END
  153.         CALL CLOSE(f)
  154.         SAY 'Updated Lists/Files'
  155.       END
  156.     x=OPEN(f,bbspath'Lists/Files.ALPHA','W')
  157.     IF x=0 THEN SAY bbspath'Lists/Files.ALPHA failed to open for writing!'
  158.     ELSE
  159.       DO
  160.         DO i=1 TO a.0
  161.           IF a.i~='' THEN CALL WRITELN(f,a.i)
  162.         END
  163.         CALL CLOSE(f)
  164.         SAY 'Updated Lists/Files.ALPHA'
  165.       END
  166.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  167.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  168.   END
  169.  
  170. DROP a. f. libs.
  171.  
  172. IF EXISTS('RAM:QUICK/Files') THEN
  173.   ADDRESS COMMAND 'delete RAM:QUICK/Files ALL QUIET'
  174.  
  175. IF EXISTS('RAM:QUICK/Information') THEN
  176.   DO
  177.     IF level=99 THEN
  178.       ADDRESS COMMAND 'copy RAM:QUICK/Information/#?' bbspath'Information'
  179.     ADDRESS COMMAND 'delete RAM:QUICK/Information ALL QUIET'
  180.   END
  181. IF EXISTS('RAM:QUICK/BBS_TEXT') THEN
  182.   DO
  183.     IF level=99 THEN
  184.       ADDRESS COMMAND 'copy RAM:QUICK/BBS_TEXT/#?' bbspath'BBS_TEXT'
  185.     ADDRESS COMMAND 'delete RAM:QUICK/BBS_TEXT ALL QUIET'
  186.   END
  187. IF EXISTS('RAM:QUICK/rexxDoors') THEN
  188.   DO
  189.     IF level=99 THEN
  190.       ADDRESS COMMAND 'copy RAM:QUICK/rexxDoors/#?' bbspath'rexxDoors ALL'
  191.     ADDRESS COMMAND 'delete RAM:QUICK/rexxDoors ALL QUIET'
  192.   END
  193. IF EXISTS('RAM:QUICK/REXX') THEN
  194.   DO
  195.     IF level=99 THEN
  196.       ADDRESS COMMAND 'copy RAM:QUICK/REXX/#? REXX:'
  197.     ADDRESS COMMAND 'delete RAM:QUICK/REXX ALL QUIET'
  198.   END
  199. IF EXISTS('RAM:QUICK/S') THEN
  200.   DO
  201.     IF level=99 THEN
  202.       ADDRESS COMMAND 'copy RAM:QUICK/S/#? S:'
  203.     ADDRESS COMMAND 'delete RAM:QUICK/S ALL QUIET'
  204.   END
  205. IF EXISTS('RAM:QUICK/C') THEN
  206.   DO
  207.     IF level=99 THEN
  208.       ADDRESS COMMAND 'copy RAM:QUICK/C/#? C:'
  209.     ADDRESS COMMAND 'delete RAM:QUICK/C ALL QUIET'
  210.   END
  211. IF EXISTS('RAM:QUICK/MSG') THEN
  212.   DO
  213.     IF level=99 THEN
  214.       DO
  215.         d=SHOWDIR('RAM:QUICK/MSG','F')
  216.         DO i=1 TO WORDS(d)
  217.           msg=WORD(d,i)
  218.           PARSE VAR msg 'MSG'conf'.'msgnum
  219.           IF DATATYPE(conf,'W') & DATATYPE(msgnum,'W') THEN
  220.             DO
  221.               newname=msgpath'MSG'conf'/'msgnum
  222.               IF EXISTS(newname) THEN
  223.                 DO
  224.                   SAY newname 'already exists!'
  225.                   ITERATE i
  226.                 END
  227.               x=OPEN(f,'RAM:QUICK/MSG/'msg,'R')
  228.               IF x=0 THEN ITERATE i
  229.               a=READCH(f,65000)
  230.               CALL CLOSE(f)
  231.               a='!!'SUBSTR(a,3)
  232.               x=OPEN(f,newname,'W')
  233.               IF x=0 THEN ITERATE i
  234.               CALL WRITECH(f,a)
  235.               CALL CLOSE(f)
  236.               SAY 'Un-deleted message' msgnum 'in conference' conf
  237.             END
  238.         END
  239.       END
  240.     ADDRESS COMMAND 'delete RAM:QUICK/MSG ALL QUIET'
  241.   END
  242. SAY
  243.  
  244. IF EXISTS('Super') THEN
  245.   DO
  246.     IF level=99 & EXISTS('Super/Super.rexx') THEN
  247.       DO
  248.         CALL PRAGMA('D','Super')
  249.         SAY 'running Super.rexx...'
  250.         CALL Super.rexx()
  251.         CALL PRAGMA('D','/')
  252.         SAY
  253.       END
  254.     CALL DELETE('Super/Super.rexx')
  255.     CALL DELETE('Super')
  256.   END
  257.  
  258. d=SHOWDIR('RAM:QUICK','F')
  259. IF d~='' THEN
  260.   DO
  261.     SAY
  262.     SAY 'Unable to process the following files.'
  263.     SAY
  264.     DO i=1 TO WORDS(d)
  265.       SAY
  266.       dname=WORD(d,i)
  267.       SAY 'Filename:' dname
  268.       x=OPEN(f,'RAM:QUICK/'dname,'R')
  269.       IF x=0 THEN
  270.         DO
  271.          SAY dname 'failed to open for reading!'
  272.           ITERATE i
  273.         END
  274.       stuff=READCH(f,65000)
  275.       CALL CLOSE(f)
  276.       CALL WRITECH(STDOUT,stuff)
  277.       CALL DELETE('RAM:QUICK/'dname)
  278.     END
  279.   END
  280.  
  281. DONE:
  282. CALL DELETE(arcfile)
  283.  
  284. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  285.   DO
  286.     oldmess=GETCLIP('BBS_MESSAGE')
  287.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  288.     newmess='Your QUICKIN archive has been processed. A report is waiting in Email.'
  289.     CALL SETCLIP('BBS_MESSAGE',oldmess||newmess)
  290.     IF upfiles>0 | upmail>0 | upmsg~='' THEN
  291.       DO
  292.         CALL SETCLIP(name'_UPDATE',upfiles upbytes upmail upmsg)
  293.         upfiles=0
  294.         upbytes=0
  295.         upmail=0
  296.         upmsg=''
  297.       END
  298.   END
  299.  
  300. IF upfiles>0 | upmail>0 | upmsg~='' THEN
  301.   DO
  302.     x=OPEN(f,bbspath'Users/'name,'R')
  303.     IF x~=0 THEN
  304.       DO
  305.         data.=''
  306.         DO i=1
  307.           line=READLN(f)
  308.           IF EOF(f) THEN LEAVE i
  309.           data.i=line
  310.         END
  311.         CALL CLOSE(f)
  312.         data.0=i-1
  313.         IF upfiles>0 THEN
  314.           DO
  315.             files=WORD(data.14,1)
  316.             bytes=WORD(data.14,3)
  317.             IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  318.             IF ~DATATYPE(bytes,'W') THEN bytes=upbytes
  319.             ELSE IF fromcli THEN
  320.               DO
  321.                 bytes=bytes+upbytes
  322.                 files=files+1
  323.               END
  324.             data.14=upfiles 'files' bytes 'bytes.' DATE()
  325.           END
  326.         IF upmail>0 THEN
  327.           DO
  328.             mail=WORD(data.17,2)
  329.             IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  330.             data.17=WORD(data.17,1) upmail WORD(data.17,3)
  331.           END
  332.         IF upmsg~='' THEN
  333.           DO
  334.             temp=data.23
  335.             DO i=1 TO level
  336.               msg=WORD(temp,i)
  337.               IF ~DATATYPE(msg,'W') THEN msg=0
  338.               IF FIND(upmsg,i) THEN msg=msg+1
  339.               data.23=data.23 msg
  340.             END
  341.           END
  342.         x=OPEN(f,bbspath'Users/'name,'W')
  343.         IF x~=0 THEN
  344.           DO
  345.             DO i=1 TO data.0
  346.               CALL WRITELN(f,data.i)
  347.             END
  348.             CALL CLOSE(f)
  349.             SAY 'User file' name 'updated.'
  350.           END
  351.       END
  352.   END
  353.  
  354. SAY 'QUICKIN archive for' name 'sucessfully processed at' TIME('C')
  355. SAY 'Elapsed Time:' TIME('E')
  356. SAY
  357. CALL GETOUT(0)
  358. EXIT
  359.  
  360.  
  361. /* Functions */
  362.  
  363. do_file:
  364. PARSE VAR hdr.1 'File:' filenum .'KeyWords: 'keywords 
  365. filename=WORD(hdr.2,2)
  366. IF ~DATATYPE(filenum,'W') & ~EXISTS('Files/'filename) THEN
  367.   DO
  368.     SAY filename 'did not arrive with the QUICKIN archive!'
  369.     RETURN
  370.   END
  371. toname=WORD(hdr.3,2)
  372. lib=WORD(hdr.3,9)
  373. IF load_files() THEN RETURN
  374. IF load_alpha() THEN RETURN
  375. CALL load_libs()
  376. IF DATATYPE(filenum,'W') THEN
  377.   DO
  378.     IF f.filenum='' THEN
  379.       DO
  380.         SAY 'File number' filenum '['lib'/'filename'] does not exist!'
  381.         RETURN
  382.       END
  383.     PARSE VAR f.filenum oldlib' 'oldname .
  384.     IF lib='^' THEN lib=oldlib
  385.     IF filename='^' THEN filename=oldname
  386.   END
  387. DO ii=1 TO level
  388.   IF UPPER(lib)=UPPER(libs.ii) THEN LEAVE ii
  389. END
  390. IF ii>level THEN
  391.   DO
  392.     SAY 'Unknown File Library:' lib 'for' filename
  393.     IF sysoplibnum=0 | DATATYPE(filenum,'W') THEN RETURN
  394.     SAY 'Placing' filename 'in Sysops library.'
  395.     lib='Sysops'
  396.     libnum=sysoplibnum
  397.   END
  398. ELSE libnum=ii
  399. IF DATATYPE(filenum,'W') THEN
  400.   DO
  401.     IF sysoplevel>level THEN RETURN
  402.     subpath=oldlib'/'oldname
  403.     finfo=STATEF(bbspath'FileNotes/'subpath)
  404.     x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  405.     IF x=0 THEN
  406.       DO
  407.         SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  408.         RETURN
  409.       END
  410.     note.=''
  411.     DO ii=1 WHILE ~EOF(f)
  412.       note.ii=READLN(f)
  413.     END
  414.     CALL CLOSE(f)
  415.     note.0=ii
  416.     IF note.ii='' THEN note.0=ii-1
  417.     IF UPPER(lib)~=UPPER(oldlib) | UPPER(filename)~=UPPER(oldname) THEN
  418.       DO
  419.         IF EXISTS(libpath||subpath) THEN
  420.           DO
  421.             ADDRESS COMMAND 'copy' libpath||subpath libpath||lib'/'filename
  422.             CALL DELETE(libpath||subpath)
  423.           END
  424.         comm='copy' bbspath'FileNotes/'subpath
  425.         comm=comm bbspath'FileNotes/'lib'/'filename 'CLONE'
  426.         ADDRESS COMMAND comm
  427.         CALL DELETE(bbspath'FileNotes/'subpath)
  428.         IF UPPER(lib)~=UPPER(oldlib) THEN
  429.           DO
  430.             PARSE VAR note.3 front'Lib:' .
  431.             note.3=front'Lib:' lib
  432.             SAY '  Moved:' filename 'from' oldlib 'to' lib 'library.'
  433.           END
  434.         IF UPPER(filename)~=UPPER(oldname) THEN
  435.           DO
  436.             PARSE VAR note.2 'Name:' . 'Size: 'back
  437.             note.2='Name:' LEFT(filename,27)' Size: 'back
  438.             SAY 'Renamed:' oldname 'to' filename 'in the' lib 'library.'
  439.           END
  440.         f.filenum=lib filename
  441.       END
  442.     IF keywords~='^' THEN
  443.       DO
  444.         PARSE VAR note.1 front'KeyWords:' . 
  445.         note.1=front'KeyWords:' keywords
  446.         SAY 'Changed: KeyWords for' lib'/'filename'.'
  447.       END
  448.     IF toname~=WORD(note.3,2) & toname~='^' THEN
  449.       DO
  450.         PARSE VAR note.3 'From: 'fromname back
  451.         note.3='From:' toname back
  452.         SAY 'Changed: Uploader of' lib'/'filename 'from' fromname 'to' toname'.'
  453.       END
  454.     num=f.filenum.0
  455.     IF DATATYPE(num,'W') THEN
  456.       DO
  457.         PARSE VAR note.1 . 'KeyWords: 'keywords
  458.         alpha=LEFT(filename,22-LENGTH(WORD(note.2,4)))
  459.         alpha=alpha WORD(note.2,4) RIGHT(filenum,5)
  460.         alpha=alpha RIGHT(libnum,2) LEFT(lib,12)
  461.         alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  462.         a.num=alpha
  463.       END
  464.     DO ii=1 TO 4
  465.       hdr.ii=note.ii
  466.     END
  467.     IF EXISTS(txt) THEN
  468.       SAY 'Changed long file description for' lib'/'filename
  469.     ELSE IF note.0>4 THEN
  470.       DO
  471.         x=OPEN(f,txt,'W')
  472.         IF x=0 THEN SAY txt 'failed to open for writing!'
  473.         ELSE
  474.           DO ii=5 TO note.0
  475.             CALL WRITELN(f,note.ii)
  476.           END
  477.         CALL CLOSE(f)
  478.         CALL DELAY(14)
  479.       END
  480.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  481.   END
  482. ELSE
  483.   DO
  484.     DO ii=1 TO f.0
  485.       IF UPPER(WORD(f.ii,2))=UPPER(filename) THEN
  486.         DO
  487.           SAY filename 'is already here, in the' WORD(f.ii,1) 'library.'
  488.           RETURN
  489.         END
  490.     END
  491.     lastf=get_last(bbspath'Numbers/LastFile')
  492.     IF accessflag & sysoplevel>level THEN lib='Sysops'
  493.     ADDRESS COMMAND 'copy RAM:QUICK/Files/'filename libpath||lib
  494.     hdr.1='File:' lastf SUBSTR(hdr.1,13)
  495.     hdr.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'lib
  496.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  497.     f.lastf=lib filename
  498.     f.0=lastf
  499.     PARSE VAR hdr.1 . 'KeyWords: 'keywords
  500.     alpha=LEFT(filename,22-LENGTH(WORD(hdr.2,4)))
  501.     alpha=alpha WORD(hdr.2,4) RIGHT(lastf,5)
  502.     alpha=alpha RIGHT(libnum,2) LEFT(lib,12)
  503.     alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  504.     n=a.0+1
  505.     a.0=n
  506.     a.n=alpha
  507.     upfiles=upfiles+1
  508.     newbytes=
  509.     upbytes=upbytes+WORD(alpha,2)
  510.     SAY 'Uploaded' filename 'as file' lastf 'in the' lib 'library.'
  511.   END
  512. savefiles=1
  513. RETURN
  514.  
  515.  
  516. do_msg:
  517. toname=WORD(hdr.3,2)
  518. conf=WORD(hdr.5,8)
  519. IF conf.0~='' THEN CALL load_conf()
  520. DO ii=1 TO level
  521.   IF UPPER(conf)=UPPER(conf.ii) THEN LEAVE ii
  522. END
  523. IF ii>level THEN
  524.   DO
  525.     SAY 'Unknown Message Conference:' conf
  526.     RETURN
  527.   END
  528. confnum=ii
  529. lastm=get_last(bbspath'Numbers/LastMessage'confnum)
  530. hdr.1='  Msg:' lastm
  531. hdr.5=' Date:' DATE('W') DATE() TIME('C')
  532. hdr.5=LEFT(hdr.5,39) 'Conference:' conf
  533. replynum=WORD(hdr.3,4)
  534. IF DATATYPE(replynum,'W') THEN
  535.   DO
  536.     x=OPEN(f,msgpath'MSG'confnum'/'replynum,'R')
  537.     IF x~=0 THEN
  538.       DO
  539.         data.=''
  540.         DO ii=1 WHILE ~EOF(f)
  541.           data.ii=READLN(f)
  542.         END
  543.         CALL CLOSE(f)
  544.         data.0=ii
  545.         IF data.ii='' THEN data.0=ii-1
  546.         IF WORDS(data.1)>3 THEN data.1=data.1 lastm
  547.         ELSE data.1=data.1'   Reply' lastm
  548.         x=OPEN(f,msgpath'MSG'confnum'/'replynum,'W')
  549.         IF x~=0 THEN
  550.           DO ii=1 TO data.0
  551.             CALL WRITELN(f,data.ii)
  552.           END
  553.         CALL CLOSE(f)
  554.       END
  555.   END
  556. IF write_msg(6,msgpath'MSG'confnum'/'lastm) THEN
  557.   DO
  558.     SAY 'Sent message' lastm 'to' toname 'in the' conf 'conference.'
  559.     upmsg=STRIP(upmsg confnum)
  560.   END
  561. IF ~EXISTS(bbspath'Users/'toname) THEN RETURN
  562. x=OPEN(f,bbspath'Users/'toname,'R')
  563. IF x=0 THEN
  564.   DO
  565.     SAY bbspath'Users/'toname 'failed to open for reading.'
  566.     RETURN
  567.   END
  568. data.=''
  569. DO ii=1 WHILE ~EOF(f)
  570.   data.ii=READLN(f)
  571. END
  572. CALL CLOSE(f)
  573. data.0=ii-1
  574. data.24=data.24 confnum'/'lastm
  575. x=OPEN(f,bbspath'Users/'toname,'W')
  576. IF x=0 THEN
  577.   DO
  578.     SAY bbspath'Users/'toname 'failed to open for writing.'
  579.     RETURN
  580.   END
  581. DO ii=1 TO data.0
  582.   CALL WRITELN(f,data.ii)
  583. END
  584. CALL CLOSE(f)
  585. RETURN
  586.  
  587.  
  588. do_mail:
  589. toname=WORD(hdr.3,2)
  590. mailpath=bbspath'Email/'toname
  591. IF ~EXISTS(mailpath) THEN
  592.   DO
  593.     SAY mailpath 'does not exist!  Unable to send mail.'
  594.     RETURN
  595.   END
  596. lastm=get_last(bbspath'Numbers/LastMail')
  597. PARSE VAR hdr.1 . 'FILE: 'emailfile .
  598. hdr.1=' Mail:' lastm
  599. IF emailfile~='' & EXISTS('RAM:QUICK/Files/'emailfile) THEN
  600.   hdr.1=hdr.1'    FILE:' emailfile
  601. hdr.5=' Date: 'DATE('W') DATE() TIME('C')
  602. IF write_msg(6,mailpath'/'name'.'lastm) THEN SAY 'Sent email' lastm 'to' toname'.'
  603. IF emailfile~='' & EXISTS('RAM:QUICK/Files/'emailfile) THEN
  604.   DO
  605.     mailfilepath=bbspath'EmailFiles/'toname
  606.     CALL MAKEDIR(mailfilepath)
  607.     ADDRESS COMMAND 'copy RAM:QUICK/Files/'emailfile mailfilepath
  608.     hdr.1=hdr.1'    FILE:' emailfile
  609.     SAY '...with attached file;' emailfile
  610.   END
  611. upmail=upmail+1
  612. RETURN
  613.  
  614.  
  615. write_msg:
  616. PARSE ARG hdrstop,ofile
  617. data=''
  618. x=OPEN(f,txt,'R')
  619. IF x=0 THEN
  620.   DO
  621.     IF hdrstop=6 THEN
  622.       DO
  623.         SAY txt 'failed to open for reading.'
  624.         RETURN 0
  625.       END
  626.   END
  627. ELSE data=READCH(f,65000)
  628. CALL CLOSE(f)
  629. x=OPEN(f,ofile,'W')
  630. IF x=0 THEN
  631.   DO
  632.     SAY ofile 'failed to open for writing.'
  633.     RETURN 0
  634.   END
  635. DO ii=1 TO hdrstop
  636.   CALL WRITELN(f,hdr.ii)
  637. END
  638. IF data~='' THEN CALL WRITECH(f,data)
  639. CALL CLOSE(f)
  640. CALL DELETE(hdr)
  641. CALL DELETE(txt)
  642. RETURN 1
  643.  
  644.  
  645. load_files:
  646. IF DATATYPE(f.0,'W') THEN RETURN 0
  647. f.=''
  648. x=OPEN(f,bbspath'Lists/Files','R')
  649. IF x=0 THEN
  650.    DO
  651.     SAY bbspath'Lists/Files failed to open for reading!'
  652.     RETURN 1
  653.   END
  654. f.0=0
  655. DO ii=1 WHILE ~EOF(f)
  656.   line=READLN(f)
  657.   num=WORD(line,1)
  658.   IF DATATYPE(num,'W') THEN
  659.     DO
  660.       f.num=WORD(line,2) WORD(line,3)
  661.       IF num>f.0 THEN f.0=num
  662.     END
  663. END
  664. CALL CLOSE(f)
  665. RETURN 0
  666.  
  667.  
  668. load_alpha:
  669. IF DATATYPE(a.0,'W') THEN RETURN 0
  670. a.=''
  671. x=OPEN(f,bbspath'Lists/Files.ALPHA','R')
  672. IF x=0 THEN
  673.   DO
  674.     SAY bbspath'Lists/Files.ALPHA failed to open for reading!'
  675.     RETURN 1
  676.   END
  677. DO ii=1 WHILE ~EOF(f)
  678.   a.ii=READLN(f)
  679.   num=WORD(a.ii,3)
  680.   IF DATATYPE(num,'W') THEN f.num.0=ii
  681. END
  682. CALL CLOSE(f)
  683. a.0=ii
  684. IF a.ii='' THEN a.0=ii-1
  685. RETURN 0
  686.  
  687.  
  688. do_file_requests:
  689. fr='File_Requests'
  690. IF EXISTS(fr) THEN
  691.   DO
  692.     x=OPEN(f,fr,'R')
  693.     IF x=0 THEN
  694.       DO
  695.         SAY fr 'failed to open for reading!'
  696.         RETURN
  697.       END
  698.     fr.=''
  699.     DO i=1 WHILE ~EOF(f)
  700.       fr.i=READLN(f)
  701.     END
  702.     CALL CLOSE(f)
  703.     fr.0=i
  704.     IF fr.i='' THEN fr.0=i-1
  705.     IF load_files() THEN RETURN
  706.     selected=''
  707.     DO i=1 TO fr.0
  708.       num=fr.i
  709.       IF DATATYPE(num,'W') THEN
  710.         DO
  711.           IF f.num='' THEN
  712.             DO
  713.               SAY 'File Number' num 'does not exist!'
  714.               ITERATE i
  715.             END
  716.           subpath=WORD(f.num,1)'/'WORD(f.num,2)
  717.           finfo=STATEF(bbspath'FileNotes/'subpath)
  718.           IF finfo~='' THEN
  719.             DO
  720.               x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  721.               IF x=0 THEN
  722.                 DO
  723.                   SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  724.                   ITERATE i
  725.                 END
  726.               note.=''
  727.               DO j=1 WHILE ~EOF(f)
  728.                 note.j=READLN(f)
  729.               END
  730.               CALL CLOSE(f)
  731.               note.0=j
  732.               IF note.j='' THEN note.0=j-1
  733.               PARSE VAR note.2 line'Downloads: 'num .
  734.               IF DATATYPE(num,'W') THEN
  735.                 DO
  736.                   note.2=line'Downloads:' num+1
  737.                   x=OPEN(f,bbspath'FileNotes/'subpath,'W')
  738.                   IF x=0 THEN
  739.                     DO
  740.                       SAY bbspath'FileNotes/'subpath 'failed to open for updating!'
  741.                       ITERATE i
  742.                     END
  743.                   DO j=1 TO note.0
  744.                     CALL WRITELN(f,note.j)
  745.                   END
  746.                   CALL CLOSE(f)
  747.                 END
  748.               ELSE
  749.                 DO
  750.                   SAY 'Unable to PARSE filenote' subpath 'for download count.'
  751.                   SAY note.2
  752.                 END
  753.             END
  754.           IF EXISTS(libpath||subpath) THEN
  755.             selected=STRIP(selected libpath||subpath)
  756.           ELSE IF WORDS(finfo)>7 THEN
  757.             DO
  758.               comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  759.               IF EXISTS(comment) THEN selected=STRIP(comment selected)
  760.             END
  761.           ELSE SAY subpath 'is missing!  Unable to archive for download.'
  762.         END
  763.       ELSE IF fr.i~='' THEN
  764.         SAY 'Unknown file request!' fr.i  'Unable to archive for download.'
  765.     END
  766.     SAY
  767.     SAY 'Selected file request list:'
  768.     DO i=1 TO WORDS(selected)
  769.       SAY WORD(selected,i)
  770.     END
  771.     SAY
  772.     ADDRESS AREXX bbsArcExt.rexx name selected
  773.     CALL DELETE(fr)
  774.     SAY 'File Requests have been passed to the file archiver...'
  775.     SAY
  776.     CALL DELAY(100)
  777.   END
  778. RETURN
  779.  
  780.  
  781. do_file_deletes:
  782. fr='File_Deletes'
  783. IF ~EXISTS(fr) THEN RETURN
  784. x=OPEN(f,fr,'R')
  785. IF x=0 THEN
  786.   DO
  787.     SAY fr 'failed to open for reading!'
  788.     RETURN
  789.   END
  790. fr.=''
  791. DO i=1 WHILE ~EOF(f)
  792.   fr.i=READLN(f)
  793. END
  794. CALL CLOSE(f)
  795. fr.0=i
  796. IF fr.i='' THEN fr.0=i-1
  797. IF load_files() THEN RETURN
  798. IF load_alpha() THEN RETURN
  799. DO i=1 TO fr.0
  800.   num=fr.i
  801.   IF DATATYPE(num,'W') THEN
  802.     DO
  803.       IF f.num='' THEN
  804.         DO
  805.           SAY 'File Number' num 'does not exist to delete!'
  806.           ITERATE i
  807.         END
  808.       subpath=WORD(f.num,1)'/'WORD(f.num,2)
  809.       finfo=STATEF(bbspath'FileNotes/'subpath)
  810.       IF sysoplevel>level THEN
  811.         DO
  812.           x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  813.           IF x=0 THEN
  814.             DO
  815.               SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  816.               ITERATE i
  817.             END
  818.           CALL READLN(f)
  819.           CALL READLN(f)
  820.           from=WORD(READLN(f),2)
  821.           CALL CLOSE(f)
  822.           IF name~=from THEN
  823.             DO
  824.               SAY subpath 'not deleted.'
  825.               SAY 'You may only delete files you have uploaded yourself.'
  826.               ITERATE i
  827.             END
  828.         END
  829.       IF EXISTS(libpath||subpath) THEN
  830.         DO
  831.           IF DELETE(libpath||subpath)=0 THEN
  832.             SAY 'Failed to delete' libpath||subpath
  833.         END
  834.       ELSE IF WORDS(finfo)>7 THEN
  835.         DO
  836.           comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  837.           IF EXISTS(comment) THEN
  838.             IF DELETE(comment)=0 THEN SAY 'Failed to delete' comment
  839.         END
  840.       ELSE SAY subpath 'is missing!  Unable to delete.'
  841.       IF DELETE(bbspath'FileNotes/'subpath)=0 THEN
  842.         SAY 'Failed to delete' bbspath'FileNotes/'subpath
  843.       f.num=''
  844.       anum=f.num.0
  845.       IF DATATYPE(anum,'W') THEN a.anum=''
  846.       savefiles=1
  847.       SAY 'Deleted' subpath', file number' num'.'
  848.     END
  849.   ELSE IF STRIP(fr.i)~='' THEN SAY 'Unknown delete request!' fr.i
  850. END
  851. SAY
  852. CALL DELETE(fr)
  853. RETURN
  854.  
  855.  
  856. load_libs:
  857. IF libs.0='' THEN RETURN
  858. sysoplibnum=0
  859. libs.=''
  860. x=OPEN(f,bbspath'Lists/Libraries','R')
  861. IF x=0 THEN
  862.   DO
  863.     SAY bbspath'Lists/Libraries failed to open for reading!'
  864.     CALL GETOUT(0)
  865.   END
  866. DO ii=1
  867.   line=READLN(f)
  868.   IF EOF(f) | line='END' THEN LEAVE ii
  869.   num=WORD(line,1)
  870.   IF DATATYPE(num,'W') THEN
  871.     DO
  872.       num=num%1
  873.       IF num>0 & num<100 THEN
  874.         DO
  875.           libs.num=WORD(line,2)
  876.           IF UPPER(libs.num)='SYSOPS' THEN sysopslibnum=num
  877.         END
  878.     END
  879. END
  880. CALL CLOSE(f)
  881. RETURN
  882.  
  883.  
  884. load_conf:
  885. conf.=''
  886. x=OPEN(f,bbspath'Lists/Conferences','R')
  887. IF x=0 THEN
  888.   DO
  889.     SAY bbspath'Lists/Conferences failed to open for reading!'
  890.     CALL GETOUT(0)
  891.   END
  892. conf.=''
  893. DO ii=1
  894.   line=READLN(f)
  895.   IF EOF(f) | line='END' THEN LEAVE ii
  896.   num=WORD(line,1)
  897.   IF DATATYPE(num,'W') THEN
  898.     DO
  899.       num=num%1
  900.       IF num>0 & num<100 THEN conf.num=WORD(line,2)
  901.     END
  902. END
  903. CALL CLOSE(f)
  904. RETURN
  905.  
  906.  
  907. get_last:
  908. PARSE ARG statname
  909. x=OPEN(f,statname,'R')
  910. IF x=0 THEN
  911.   DO
  912.     SAY statname 'failed to open for reading!'
  913.     RETURN 0
  914.   END
  915. last=READLN(f)
  916. CALL CLOSE(f)
  917. IF DATATYPE(last,'W') THEN last=last+1
  918. ELSE RETURN 0
  919. OPTIONS FAILAT 20
  920. ADDRESS COMMAND 'ECHO >'statname last
  921. RETURN last
  922.  
  923.  
  924. GETOUT:
  925. ARG err 
  926. IF err>0 THEN SAY 'Error:' err'  RC='RC'  SIGL='SIGL
  927. ERROR:
  928. SYNTAX:
  929. FAILURE:
  930. IF RC>0 THEN SAY 'RC='RC'  SIGL='SIGL
  931. IF GETCLIP('BBS_'name)='QUICKIN' THEN CALL SETCLIP('BBS_'name)
  932. EXIT err
  933.  
  934. /* bbsQUICKIN.rexx */
  935.